import axios from "axios";
// import Qs from "qs";// 引入qs模块，用来序列化post类型的数据，
import { ElNotification } from "element-plus"; // 提示框

// 环境的切换，
const instance = axios.create({
  // API 请求的默认前缀
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000 // 请求超时时间
});
// http method
const METHOD = {
  GET: "get",
  POST: "post"
};
/**
 * axios请求
 * @param url 请求地址
 * @param method {METHOD} http method
 * @param params 请求参数
 * @returns {Promise<AxiosResponse<T>>}
 */
async function request(url, method, params, config) {
  switch (method) {
    case METHOD.GET:
      return axios.get(url, { params, ...config });
    case METHOD.POST:
      return axios.post(url, params, config);
    default:
      return axios.get(url, { params, ...config });
  }
}

// 设置请求拦截器
instance.interceptors.request.use(
  config => {
    const token = null;
    // 如果 token 存在
    // 让每个请求携带自定义 token 请根据实际情况自行修改
    if (token) {
      config.headers["Access-Token"] = token;
    }
    // 请求头信息是为post请求设置
    config.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8";
    // 就算请求是成功的如果没有token那么就不给retrun值，就会走响应拦截器的失败
    return config;
  },
  error => {
  // 请求拦截器 失败
    return Promise.reject(error);
  });

// 设置响应拦截器
instance.interceptors.response.use(
  response => {
    // 响应拦截拿到token，存到store状态变量中

    // 请求成功的弹窗
    ElNotification({
      title: "Success",
      message: response.data.message,
      type: "success"
    });
    // 响应拦截器 成功 返回的数据不用全部返回，可以在response中自己修改
    return response;
  },
  error => {
  // 响应拦截器 失败
    if (error && error.response) {
      let message = "";
      switch (error.response.status) {
        case 400:
          message = "请求错误";
          break;
        case 401: {
          message = "未授权，请登录";
          // 返回到登录页
          // router.replace({
          //   name: "Login"
          // });
          break;
        }
        case 403:
          message = "没有权限，拒绝访问";
          break;
        case 404:
          message = `请求地址出错`;
          break;
        case 408:
          message = "请求超时";
          break;
        case 500:
          message = "服务器内部错误";
          break;
        case 501:
          message = "服务未实现";
          break;
        case 502:
          message = "网关错误";
          break;
        case 503:
          message = "服务不可用";
          break;
        case 504:
          message = "网关超时";
          break;
        case 505:
          message = "HTTP版本不受支持";
          break;
        default:
          break;
      }
      // 对出现的问题做一个弹出提示
      ElNotification({
        title: error.response.status,
        message: message,
        type: "error"
      });
    }
    return Promise.reject(error);
  });
export {
  request,
  METHOD
};
